Cloud RunでPiping Serverを立てる方法と注意点と解決策
やりたいこと
@peaceiris氏は「書くことが全然ないくらい簡単」にできたようだが、少しハマったのでやり方も書きたい。 もっとシンプルにデプロイする方法があるかもしれない。
やり方
以下の環境変数$PORTでHTTPをリッスンするようなDockerfileを書く。
code:Dockerfile
FROM nwtgck/piping-server
LABEL maintainer="Ryo Ota <nwtgck@nwtgck.org>"
CMD "--http-port=$PORT"
以下のコマンドを叩く。プロジェクトIDは自分のものに置き換える。
code:console
$ gcloud auth configure-docker
$ docker build -t gcr.io/プロジェクトID/piping-server .
$ docker push gcr.io/プロジェクトID/piping-server
あとは、gcr.io/プロジェクトID/piping-serverを"Container image URL"に記述してCreate するだけ。
https://gyazo.com/a168acbd36f80e78094cee19756ecf42
https://gyazo.com/4186bd13f8d5200b85a9581c64cc5704
https://gyazo.com/95d54defada45fd18ac5cbb7895de247
ハマったところ
code:エラーメッセージ
....
f1b5933fe4b5: Waiting
....
ここでgcloud auth configure-dockerをした後に、docker pushを使って直接gcr.ioにpushすれば良いということが分かった。
例えば、大きなファイルをアップロードしながら同時にダウンロードもすることができない。これはCloud RunはHTTPでFaaS的なことをすることを想定しているからだと思う。REST APIやGraphQLなどのAPIサーバーのDockerイメージを手軽にデプロイできるのが売りだと思う。これに関しては下記に解決策を載せた。 だがテキストや画像など小さなデータを送る用途では問題になく使える。
ステートレスを想定している。
リクエストは最大900秒 = 15分。
https://gyazo.com/a2fa019ab899e4bf94bce74ca4c39648
Piping Serverは何十日と起動転送し続けテラバイト(TB)やペタバイト(PB)単位で転送可能だが、Cloud Runだとリクエスト時間が制限されている。FaaSだと思うので自然なこと。上記のストリーミングできない時点で必然的にリクエストに時間けれなくはなるとは思うが。下記の解決策はこれに関しても解決する。 転送量課金。
.run.appのURLを公開しなければ自分だけで公開Piping Serverを使えそうなので心配はいらなさそう(GCPの仕組み上URLがどこかに公開さるような仕組みになっていないかはちゃんと調べる必要はありそう)。みんなに教えるときはちゃんとアラートつけるとか考える。 ストリーミングできないことの解決策
「ストリーミングしながらのアップロードとダウンロードができない」に関しては、一定量でチャンクに分けてで転送することで無限にアップロードしたりダウンロードできるようになる。すでに存在するクライアントとしてPiping Chunkがある。